open Gen
open Frame

type exp =
    Const of int                   (* Entiers et Booléens *)
  | Name of Gen.label              (* Adresse mémoire nommée *)
  | Temp of Gen.temp               (* Lecture d'un temporaire *)
  | Mem of exp                     (* Lecture mémoire *)
  | Bin of binop * exp * exp       (* Opération binaire *)
  | Call of Frame.frame * exp list (* Appel de fonction ou appel système *)

and stm =
  | Label of Gen.label            (* Étiquette (dans le code) *)
  | Move_temp of Gen.temp * exp   (* Écriture dans un temporaire *)
  | Move_mem of exp * exp         (* Écriture en mémoire *)
  | Seq of stm list               (* Séquence d'instructions *)
  | Exp of exp                    (* Expression évaluée pour son effet *)
  | Jump of Gen.label             (* Saut non conditionnel *)
  | Cjump of                      (* Saut conditionnel *)
      relop * exp * exp *
        Gen.label * Gen.label

and relop = Req | Rne | Rle | Rge | Rlt | Rgt
and binop = Uplus | Plus | Minus | Times | Div | Lt | Le | Gt | Ge | Eq | Ne | And | Or
(* Uplus est l'addition non signée pour les calculs d'adresses *)
type code = stm list